package com.evasion.servicios.impl;

import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;

import weka.classifiers.Evaluation;
import weka.core.Attribute;
import weka.core.FastVector;
import weka.core.Instance;
import weka.core.Instances;

import com.evasion.persistence.dao.impl.EmpresaDAO;
import com.evasion.persistence.entidades.DatosGenerale;
import com.evasion.servicios.ServicioAdministracion;

/**
 * Session Bean implementation class ServicioAdministracion
 */
@Stateless
@LocalBean

public class ServicioAdministracionImpl implements ServicioAdministracion {

	@EJB
	private EmpresaDAO empresaDAO;

	/**
	 * Default constructor.
	 */
	public ServicioAdministracionImpl() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public DatosGenerale registrarEmpresa(DatosGenerale empresa) {
		DatosGenerale empresaRegistrada = null;
		
		try {
		empresaRegistrada = empresaDAO.guardarOActualizar(empresa);
			
		} catch (Exception e) {
			System.out.println("Error al guardar Empresa : "+e);
		}
		
		return empresaRegistrada;
	}
	
	
	@Override
	public DatosGenerale actualizarEmpresa(DatosGenerale empresa) {
		DatosGenerale empresaActualizada = null;
		
		try {
		empresaActualizada =  empresaDAO.guardarOActualizar(empresa);
			
		} catch (Exception e) {
			System.out.println("Error al guardar Empresa : "+e);
		}
		
		return empresaActualizada;
	}
	
	
	@Override
	public List<DatosGenerale> getTodasEmpresas(Date fechaInicio, Date fechaFin){
		List<DatosGenerale> empresasRegistrada = null;
		
		try {
		 if(fechaInicio!=null && fechaFin!=null)
			 empresasRegistrada = empresaDAO.obtenerTodasPorRangoFecha(fechaInicio, fechaFin);
		 else
			empresasRegistrada = empresaDAO.obtenerTodos();
			
		} catch (Exception e) {
			System.out.println("Error al obtener Empresas : "+e);
		}
		
		return empresasRegistrada;
	}
	
	@Override
	public List<DatosGenerale> buscarEmpresasPorCliente(String nombreCliente, Date fechaInicio, Date fechaFin){
		List<DatosGenerale> empresasRegistradas = null;
		
		try {
		empresasRegistradas = empresaDAO.getEmpresasPorCliente(nombreCliente, fechaInicio, fechaFin);
			
		} catch (Exception e) {
			System.out.println("Error al obtener Empresas Por Clientes : "+e);
		}
		
		return empresasRegistradas;
	}
	
	@Override
	public List<DatosGenerale> buscarEmpresasPorRegion(String region, Date fechaInicio, Date fechaFin){
		List<DatosGenerale> empresasRegistradas = null;
		
		try {
		empresasRegistradas = empresaDAO.getEmpresasPorRegion(region, fechaInicio, fechaFin);
			
		} catch (Exception e) {
			System.out.println("Error al obtener Empresas Por Clientes : "+e);
		}
		
		return empresasRegistradas;
	}
	
	@Override
	public List<DatosGenerale> buscarEmpresasPorEvasion(String estadoEvasion, Date fechaInicio, Date fechaFin) {
		List<DatosGenerale> empresasRegistradas = null;
		
		try {
		empresasRegistradas = empresaDAO.getEmpresasPorEstadoEvasion(estadoEvasion, fechaInicio, fechaFin);
			
		} catch (Exception e) {
			System.out.println("Error al obtener Empresas Por Evasion : "+e);
		}
		
		return empresasRegistradas;
	}
	
	@Override
	public DatosGenerale clasificarEmpresa(DatosGenerale empresa) {
		DatosGenerale empresaClasificada = empresa;
		
		try {
			
			FastVector situacion = new FastVector(2);
			// Create vector of the above attributes
		    FastVector attributes = new FastVector(8);
		    situacion.addElement("evade");
		    situacion.addElement("no evade");
			
			List<DatosGenerale> datos = empresaDAO.obtenerTodos();
			Attribute produccion = new Attribute("produccion");
			Attribute ventas = new Attribute("ventas");
			Attribute gastos = new Attribute("gastos");
			Attribute exportacion = new Attribute("exportacion");
			Attribute importacion = new Attribute("importacion");
			Attribute impuesto = new Attribute("impuesto");
			Attribute deudas = new Attribute("deudas");
		   Attribute attribute = new Attribute("class", situacion); 	    
		   
		
		    attributes.addElement(produccion);
		    attributes.addElement(ventas);
		    attributes.addElement(gastos);
		    attributes.addElement(exportacion);
		    attributes.addElement(importacion);
		    attributes.addElement(impuesto);
		    attributes.addElement(deudas);
		   attributes.addElement(attribute);
		   
		   Instances insts = new Instances("Empresas", attributes, datos.size());
		    for (int i = 0; i < datos.size(); i++) {
				
		    	// Create empty instance with three attribute values
		        Instance inst = new Instance(8);
		             
		        // Set instance's values for the attributes "x", "y", and "z"
		        inst.setValue(produccion, datos.get(i).getProduccion());
		        inst.setValue(ventas, datos.get(i).getVentas());
				inst.setValue(gastos, datos.get(i).getGastos());
				inst.setValue(exportacion, datos.get(i).getExportacion());
				inst.setValue(importacion, datos.get(i).getImportacion());
				inst.setValue(impuesto, datos.get(i).getImpuesto());
				inst.setValue(deudas, datos.get(i).getDeudas());
				inst.setValue(attribute, datos.get(i).getSituacion()); 
		 
				// Set instance's dataset to be the dataset "wekaPoints"
		        inst.setDataset(insts);
		             
		        // Add the Instance to Instances
		        insts.add(inst);
			}
		    
		        
		    insts.setClassIndex(insts.numAttributes() - 1);
		    
		    
		    FastVector situacionP = new FastVector(2);
			// Create vector of the above attributes
		    FastVector attributesP = new FastVector(8);
		    situacionP.addElement("evade");
		    situacionP.addElement("no evade");
			

			Attribute produccionP = new Attribute("produccion");
			Attribute ventasP = new Attribute("ventas");
			Attribute gastosP = new Attribute("gastos");
			Attribute exportacionP = new Attribute("exportacion");
			Attribute importacionP = new Attribute("importacion");
			Attribute impuestoP = new Attribute("impuesto");
			Attribute deudasP = new Attribute("deudas");
		   Attribute attributeP = new Attribute("class", situacionP); 	    
		   
		
		    attributesP.addElement(produccionP);
		    attributesP.addElement(ventasP);
		    attributesP.addElement(gastosP);
		    attributesP.addElement(exportacionP);
		    attributesP.addElement(importacionP);
		    attributesP.addElement(impuestoP);
		    attributesP.addElement(deudasP);
		   attributesP.addElement(attributeP);
		   
		   Instances instsP = new Instances("EmpresaPrueba", attributesP, 1);
		    
				
		    	// Create empty instance with three attribute values
		        Instance instP = new Instance(8);
		             
		        // Set instance's values for the attributes "x", "y", and "z"
		        instP.setValue(produccionP, empresa.getProduccion());
		        instP.setValue(ventasP, empresa.getVentas());
				instP.setValue(gastosP, empresa.getGastos());
				instP.setValue(exportacionP, empresa.getExportacion());
				instP.setValue(importacionP, empresa.getImportacion());
				instP.setValue(impuestoP, empresa.getImpuesto());
				instP.setValue(deudasP, empresa.getDeudas());
				// Set instance's dataset to be the dataset "wekaPoints"
		        instP.setDataset(instsP);
		             
		        // Add the Instance to Instances
		        instsP.add(instP);
		        instsP.setClassIndex(instsP.numAttributes() - 1);
		     
		  //CREACION DE UN MODELO
            weka.classifiers.Classifier model1 = new weka.classifiers.functions.Logistic();
            model1.buildClassifier(insts);
          //OBTENER LA PRIMERA EVALUACION
            Evaluation evalua1 = new Evaluation(insts);
            evalua1.evaluateModel(model1, insts);

            System.out.println("---RESUMEN EVALUA1----");
            System.out.println(evalua1.toSummaryString());
            System.out.println("---MODEL 1----");
            System.out.println(model1.toString());
            
            //clasificacion
            double pred = model1.classifyInstance(instsP.instance(0));

            System.out.println("ID: " + instsP.instance(0).value(0));

            System.out.println("esperando : "
                    + instsP.classAttribute().value((int) pred));
            empresaClasificada.setSituacion(instsP.classAttribute().value((int) pred));
			
		} catch (Exception e) {
			System.out.println("Error al Clasificar Empresa : "+e);
		}
		return empresaClasificada;
	}
	
	
		@Override
		public DatosGenerale obtenerEmpresaPorId(Integer idEmpresa){
			DatosGenerale empresaRegistrada = null;
			
			try {
			empresaRegistrada = empresaDAO.buscarPorId(idEmpresa);
				
			} catch (Exception e) {
				System.out.println("Error al obtener Empresa Por Id : "+e);
			}
			
			return empresaRegistrada;
		}
	
}
